<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    // 有了Promise对象，就可以将异步操作以同步操作的流程表达出来，避免了层层嵌套的回调函数。此外，Promise对象提供统一的接口，使得控制异步操作更加容易。

    // Promise的拓展方法 [[Prototype]] -> Promise.prototype  -> 所有Promise对象(实例化对象) 均可以访问

    // then(resolveCallback,rejectCallback)  接收两个回调函数,分别用于指定状态改变时要执行的内容
    // resolveCallback => 当Promise对象 由 pending(进行中) 改为 fulfilled(已成功)时,执行此回调函数
    // rejectCallback  => 当Promise对象 由 pending(进行中) 改为 rejected(已失败)时,执行此回调函数

    // 返回值: 新的Promise对象 -> 链式操作

    // 注意: 
    // 1. then() 提前指定了Promise对象状态改变时要执行的回调函数 -> 等Promise对象状态改变且异步任务执行完毕 -> 在执行对应的回调函数
    // 2. resolveCallback() rejectCallback() 都有一个形式参数 -> 接收Promise对象中存储的数据


    debugger;
    var p = new Promise(function (resolve, reject) {
        // 回调函数 -> 所谓的容器 -> 一般用来处理异步操作(同步也可以)

        setTimeout(() => {
            debugger;
            // var num = Math.random(); // 0-1
            var num = 0.1;
            console.log(num);
            if (num >= 0.5) {
                resolve("不拖堂");  // {<fulfilled>: '不拖堂'}
            } else {
                reject("拖堂");   // {<rejected>: '拖堂'}
            }
            console.log("2s后:", p);
        }, 2000)


    })

    console.log("加载时", p); // {<pending>:undefined}

    // then()方法 接收两个回调函数,分别用于指定状态改变时要执行的内容
    p.then(function (arg) {
        debugger;
        console.log("fulfilled", arg);
        console.log("说不拖堂就不拖堂");
    }, function (arg) {
        debugger;
        console.log("rejected", arg);
        console.log("该拖还要拖");
    })


</script>

</html>